home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / xwindows / demos / xfract_1.z / xfract_1 / xfractint-1.06 / diskvidu.c < prev    next >
C/C++ Source or Header  |  1992-09-28  |  5KB  |  216 lines

  1. /*
  2.    "Disk-Video" for Unix routines.
  3.  
  4.    All the expanded memory caching stuff has been removed for the Unix
  5.    version.  We just keep the data in memory and write it out to a file
  6.    when we're done.  (Let virtual memory look after the details.)
  7.  
  8. */
  9.  
  10. #include <stdio.h>
  11. #ifndef XFRACT
  12. #include <dos.h>
  13. #endif
  14. #include "fractint.h"
  15.  
  16. extern int sxdots, sydots, colors;
  17. extern int dotmode;      /* video access method, 11 if really disk video */
  18. extern int diskisactive;  /* set by fractint to disable re-init */
  19. extern int debugflag;
  20. extern int diskflag;
  21.  
  22. #define BOXROW     6
  23. #define BOXCOL     11
  24. #define BOXWIDTH 57
  25. #define BOXDEPTH 12
  26.  
  27. #define TIMETODISPLAY 10000
  28.  
  29. int disk16bit=0;       /* storing 16 bit values for continuous potential */
  30.  
  31. extern int Shadowing, AntiAliasing;
  32.  
  33. static int timetodisplay;
  34. static FILE *fp = NULL;
  35. static int disktarga;
  36.  
  37. static int headerlength;
  38. static unsigned int rowsize = 0;   /* doubles as a disk video not ok flag */
  39. static unsigned int colsize;       /* sydots, *2 when pot16bit */
  40.  
  41. static BYTE *dataPtr = NULL;
  42.  
  43. int startdisk(),pot_startdisk();
  44. static common_startdisk();
  45. void enddisk();
  46. int targa_startdisk(FILE *, int);
  47. void targa_readdisk (unsigned int, unsigned int,
  48.              BYTE *, BYTE *, BYTE *);
  49. void targa_writedisk(unsigned int, unsigned int,
  50.              BYTE, BYTE, BYTE);
  51. void dvid_status(int,char *);
  52.  
  53. int made_dsktemp = 0;
  54.  
  55. int startdisk()
  56. {
  57.    if (!diskisactive)
  58.       return(0);
  59.    headerlength = disktarga = 0;
  60.    return (common_startdisk(sxdots,sydots));
  61.    }
  62.  
  63. int pot_startdisk()
  64. {
  65.    int i;
  66.    if (dotmode == 11) /* ditch the original disk file */
  67.       enddisk();
  68.    else
  69.       showtempmsg("clearing 16bit pot work area");
  70.    headerlength = disktarga = 0;
  71.    i = common_startdisk(sxdots,sydots<<1);
  72.    cleartempmsg();
  73.    disk16bit = 1;
  74.    return (i);
  75.    }
  76.  
  77. int targa_startdisk(FILE *targafp,int overhead)
  78. {
  79.    int i;
  80.    if (dotmode == 11) { /* ditch the original disk file, make just the targa */
  81.       enddisk();      /* close the 'screen' */
  82.       setnullvideo(); /* set readdot and writedot routines to do nothing */
  83.       }
  84.    headerlength = overhead;
  85.    fp = targafp;
  86.    disktarga = 1;
  87.    i = common_startdisk(sxdots*3,sydots);
  88.    return (i);
  89. }
  90.  
  91. static int _fastcall near common_startdisk(int newrowsize, int newcolsize)
  92. {
  93.    int i,success;
  94.    long memorysize;
  95.  
  96.    if (diskflag)
  97.       enddisk();
  98.    if (dotmode == 11) { /* otherwise, real screen also in use, don't hit it */
  99.       char buf[20];
  100.       helptitle();
  101.       setattr(1,0,C_DVID_BKGRD,24*80);    /* init rest to background */
  102.       for (i = 0; i < BOXDEPTH; ++i)
  103.      setattr(BOXROW+i,BOXCOL,C_DVID_LO,BOXWIDTH);  /* init box */
  104.       putstring(BOXROW+2,BOXCOL+4,C_DVID_HI,"'Disk-Video' mode");
  105.       putstring(BOXROW+4,BOXCOL+4,C_DVID_LO,"Screen resolution: ");
  106.       sprintf(buf,"%d x %d",sxdots,sydots);
  107.       putstring(-1,-1,C_DVID_LO,buf);
  108.       if (disktarga)
  109.      putstring(-1,-1,C_DVID_LO,"  24 bit Targa");
  110.       else {
  111.      putstring(-1,-1,C_DVID_LO,"  Colors: ");
  112.      sprintf(buf,"%d",colors);
  113.      putstring(-1,-1,C_DVID_LO,buf);
  114.      }
  115.       putstring(BOXROW+8,BOXCOL+4,C_DVID_LO,"Status:");
  116.       dvid_status(0,"clearing the 'screen'");
  117.       }
  118.    timetodisplay = TIMETODISPLAY;  /* time-to-display-status counter */
  119.  
  120.    memorysize = (long)(newcolsize) * newrowsize;
  121.    diskflag = 1;
  122.    rowsize = newrowsize;
  123.    colsize = newcolsize;
  124.  
  125.    if (dataPtr != NULL) {
  126.        free(dataPtr);
  127.    }
  128.    dataPtr = (BYTE *)malloc(memorysize);
  129.  
  130.   bzero(dataPtr,memorysize);
  131.  
  132. common_okend:
  133.    if (dotmode == 11)
  134.       dvid_status(0,"");
  135.    return(0);
  136. }
  137.  
  138. void enddisk()
  139. {
  140.    diskflag = rowsize = disk16bit = 0;
  141.    fp           = NULL;
  142. }
  143.  
  144. int readdisk(int col, int row)
  145. {
  146.    char buf[41];
  147.    if (--timetodisplay < 0) {  /* time to display status? */
  148.       if (dotmode == 11) {
  149.      sprintf(buf," reading line %4d",
  150.         (row >= sydots) ? row-sydots : row); /* adjust when potfile */
  151.      dvid_status(0,buf);
  152.      }
  153.       timetodisplay = TIMETODISPLAY;
  154.       }
  155.    if (row>=colsize || col>=rowsize) {
  156.        return 0;
  157.    }
  158.    return dataPtr[row*rowsize+col];
  159. }
  160.  
  161. void targa_readdisk(unsigned int col, unsigned int row,
  162.             BYTE *red, BYTE *green, BYTE *blue)
  163. {
  164.    col *= 3;
  165.    *blue  = readdisk(col,row);
  166.    *green = readdisk(++col,row);
  167.    *red   = readdisk(col+1,row);
  168. }
  169.  
  170. void writedisk(int col, int row, int color)
  171. {
  172.    char buf[41];
  173.    if (--timetodisplay < 0) {  /* time to display status? */
  174.       if (dotmode == 11) {
  175.      sprintf(buf," writing line %4d",
  176.         (row >= sydots) ? row-sydots : row); /* adjust when potfile */
  177.      dvid_status(0,buf);
  178.      }
  179.       timetodisplay = TIMETODISPLAY;
  180.       }
  181.    if (row>=colsize || col>=rowsize) {
  182.        return;
  183.    }
  184.    dataPtr[row*rowsize+col] = color;
  185.    if (Shadowing) {
  186.       unsigned Mask;
  187.       Mask = (1 << AntiAliasing) - 1;
  188.       if(!(col & Mask) && !(row & Mask))
  189.      ShadowPutColor(col, row, color);
  190.       }
  191. }
  192.  
  193. void targa_writedisk(unsigned int col, unsigned int row,
  194.             BYTE red, BYTE green, BYTE blue)
  195. {
  196.    writedisk(col*=3,row,blue);
  197.    writedisk(++col, row,green);
  198.    writedisk(col+1, row,red);
  199. }
  200.  
  201. void dvid_status(int line,char *msg)
  202. {
  203.    char buf[41];
  204.    int attrib;
  205.    memset(buf,' ',40);
  206.    memcpy(buf,msg,strlen(msg));
  207.    buf[40] = 0;
  208.    attrib = C_DVID_HI;
  209.    if (line >= 100) {
  210.       line -= 100;
  211.       attrib = C_STOP_ERR;
  212.       }
  213.    putstring(BOXROW+8+line,BOXCOL+12,attrib,buf);
  214.    movecursor(25,80);
  215. }
  216.